﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Belmost4PDA.CommonForms;
using Belmost4PDA.DatabaseWorkPDA;
using Belmost4PDA.Fasade;

namespace Belmost4PDA.Logic
{
    public class StateRecordElem:StateRecord
    {
        public StateRecordElem(int id, string text, int panel)
            : base(id, text, panel)
        {
            
        }

        private static Form _form = null;
        private TreeView treeView = null;
        private List<TreeNode> nodesForDel = new List<TreeNode>();
        public override void RunState(Form form)
        {
            _form = form;
            stateElem SEform = new stateElem();
            form.Controls.Clear(); 
            foreach (Control control in SEform.Controls)
            {
               form.Controls.Add(control); 
            }
            form.Menu = SEform.Menu;
            //set actions
          //  form.Menu.MenuItems[1].MenuItems[0].Click += StateRecordElem_Click;
            form.Menu.MenuItems[1].Click += StateRecordElem_Click_NoPost;
            form.Menu.MenuItems[0].MenuItems[0].Click += Add_Click;
            form.Menu.MenuItems[0].MenuItems[1].Click += Edit_Click;
            form.Menu.MenuItems[0].MenuItems[2].Click += Del_Click;
            //if (MainParams.GetParam(MainParams.ParamName.isLight) == "1") 
            // теперь в релизе нельзя редактировать дерево
            {
                //0form.Menu.MenuItems[0].Enabled = false;
                form.Menu.MenuItems.Remove(form.Menu.MenuItems[0]);
            }
            SEform.treeView1.Nodes.Add("Test - ok");
            LoadElements(SEform.treeView1);
            treeView = SEform.treeView1;
            nodesForDel.Clear();// на всякий случай
        }
        private  void Edit_Click(object sender, EventArgs e)
        {
            if (treeView != null)
                if (treeView.SelectedNode != null)
                    if(treeView.SelectedNode.Parent!=null)
                {
                    int id = ((brElement)treeView.SelectedNode.Parent.Tag).elmItem.elmCode;
                    // выбор дочерних
                    string suff = "";

                    int idnew = GetElmBMItem(id, ref suff);
                    if (idnew != -1)
                    {
                        // выбор подтипа
                        int elmclass = GetElmBMClass(idnew);
                        //
                        if (elmclass != -1)
                        {
                            // готовы для вставки
                            TreeNode newNode = CreateNewItem(((brElement)treeView.SelectedNode.Parent.Tag), idnew, elmclass, suff);
                            ((brElement) newNode.Tag).Child.AddRange(((brElement) treeView.SelectedNode.Tag).Child);
                            ((brElement)treeView.SelectedNode.Tag).Child.Clear(); // Попробуй поклирить без AddRange будут null RE:Это надо сделать иначе при удалении ноды удаляться и сабноды из базы (RE to : это низя делать. ты ссылку убьешь ;) )
                            // удалени старой ноды
                            // текущий нод перемещаеться в список для удаления (если это не только что соданный элемент)
                            if (!((brElement)treeView.SelectedNode.Tag).isNewElem)
                                nodesForDel.Add(treeView.SelectedNode);
                            TreeNode[] tr = new TreeNode[treeView.SelectedNode.Nodes.Count];
                            for (int i = 0; i < treeView.SelectedNode.Nodes.Count; i++)
                            {
                                tr[i] = treeView.SelectedNode.Nodes[i];
                            }
                            //вставка в treeview newNode
                            treeView.SelectedNode.Parent.Nodes.Add(newNode);
                            treeView.SelectedNode.Remove();
                            treeView.SelectedNode = newNode;
                            treeView.SelectedNode.Nodes.AddRange(tr); 
                        }
                    }
                } 
    
        }
        private  void Del_Click(object sender, EventArgs e)
        {
            if(treeView!=null)
                if(treeView.SelectedNode!=null)
                    if(treeView.SelectedNode.Parent!=null) // этим мы гарантируем что есть один элемент всегда
                        if(new Dialogs().CommitDelete())
                        {
                            // текущий нод перемещаеться в список для удаления (если это не только что соданный элемент)
                           if (!((brElement)treeView.SelectedNode.Tag).isNewElem)
                                nodesForDel.Add(treeView.SelectedNode);
                            ((brElement)treeView.SelectedNode.Tag).Delete();
                            treeView.SelectedNode.Remove();
                        }
        }

        private void Add_Click(object sender, EventArgs e)
        {
            if (treeView != null)
                if (treeView.SelectedNode != null)
                {
                    int id = ((brElement) treeView.SelectedNode.Tag).elmItem.elmCode;        
                    // выбор дочерних
                    string suff = "";
                  
                    int idnew = GetElmBMItem(id, ref suff);
                    if(idnew != -1)
                    {
                        // выбор подтипа

                        int elmclass = GetElmBMClass(idnew);
                        //
                        if(elmclass!=-1)
                        {
                            // готовы для вставки
                            treeView.SelectedNode.Nodes.Add(
                                CreateNewItem(((brElement) treeView.SelectedNode.Tag), idnew, elmclass, suff));
                        }
                    }
                }              
        }

        /// <summary>
        /// Создает новый brElement. Создает и возвращает новый нод для дерева. brElement помечаеться как новый (isNewElem).
        /// </summary>
        /// <param name="topelement">The element.</param>
        /// <param name="idnew">The idnew.</param>
        /// <param name="elmclass">The elmclass.</param>
        /// <returns></returns>
        private TreeNode CreateNewItem(brElement topelement, int idnew, int elmclass, string suff)
        {
            brElement newElm = brElement.GetNewItem(topelement, idnew, elmclass, suff);
            TreeNode node = new TreeNode(newElm.Name);
            node.Tag = newElm;
            return node;
        }

        /// <summary>
        /// Отображает диалог выбора из классификатора для жлемента если у него заполнено clsName. Иначе возвращает 0. Если отмена то -1
        /// </summary>
        /// <param name="idnew">The idnew.</param>
        /// <returns></returns>
        private int GetElmBMClass(int idnew)
        {
            string sel = "select * from ElmBM where elmCode = "+ idnew;
            QuerySelect q=new QuerySelect();
            q.Select(sel);
            List<DataRows.DataRows> lst = q.GetRows();
            string cls=lst[0].FieldByName("clsname");
            if(cls==string.Empty)
                return 0;
            else
            {
                sel = "select " + cls + " as ID, clsText as Text from " +
                      cls+ " order by "+cls;
                q.Select(sel);
                lst = q.GetRows();
               
                Dictionary<string, string> dic=new Dictionary<string, string>();
                DlgSelectItem form =new DlgSelectItem();
                form.list.Items.Clear();
                foreach (DataRows.DataRows rows in lst)
                {
                    string id, text;
                    id = rows.FieldByName("ID");
                    text = rows.FieldByName("Text");
                    dic.Add(text, id);
                    form.list.Items.Add(text);
             
                }
                if (form.ShowDialog() == DialogResult.OK)
                {
                    if (form.list.SelectedItem != null) return int.Parse(dic[form.list.SelectedItem.ToString()]);
                    else MessageBox.Show("Ничего не выбрано","Ошибка");
                }
                else return -1;
                    
            }
            return -1;
        }

        /// <summary>
        /// Отображает диалог выбора элемента из ElmBM у которого owmElm == id
        /// </summary>
        /// <param name="idparent">The id.</param>
        /// <returns>возвращает id выбранного элемента или -1 если была нажата отмена</returns>
        /// <param name="suff"> сюда заогоняеться суффикс</param>
        private int GetElmBMItem(int idparent, ref string suff)
        {
            string sel = "select * from ElmBM where ownElm = "+ idparent;
            QuerySelect q = new QuerySelect();
            q.Select(sel);
            List<DataRows.DataRows> lst = q.GetRows();
            DlgSelectItem form = new DlgSelectItem();
            Dictionary<string, string> dic = new Dictionary<string, string>();
            form.list.Items.Clear();
            foreach (DataRows.DataRows rows in lst)
            {
                string id = rows.FieldByName("ElmCode");
                string name = rows.FieldByName("ElmName");
                dic.Add(name,id);
                form.list.Items.Add(name);
            }
            form.SuffOn();
            form.suff.Text = suff;
            //form.Show();
            if (form.ShowDialog() == DialogResult.OK)
            {
                suff = form.suff.Text;
                //if (suff.LastIndexOf("'", 0) != -1)
                //    suff=suff.Replace("'", "''");
                if (form.list.SelectedItem != null) return Convert.ToInt32(dic[form.list.SelectedItem.ToString()]);
                else MessageBox.Show("Ничего не выбрано", "Ошибка");
            }
            else return -1;
            return -1;
        }

        /// <summary>
        /// Loads the elements of bridge into treeView
        /// </summary>
        /// <param name="view1">The view1.</param>
        private void LoadElements(TreeView view1)
        {
            /// получить деево элементов из brElement.GetTree
            /// перенести дерево в treeview. для TreeNode устанавливаеть значение Tag в сооствествующий 
            /// brElement
            view1.Nodes.Clear();
            brElement tree=brElement.GetTree();
            if (tree.Child.Count != 0)
            {
                TreeNode node;
                foreach (brElement elem in tree.Child[0].Child)
                {
                    node = new TreeNode(elem.Name);
                    node.Tag = elem;
                    view1.Nodes.Add(node);
                    LoadChild(node, elem);
                }
            }
        }
        private void LoadChild(TreeNode parent, brElement brelem)
        {
            TreeNode node;
            foreach (brElement elem in brelem.Child)
            {
                node = new TreeNode(elem.Name);
                node.Tag = elem;
                parent.Nodes.Add(node);
                LoadChild(node,elem);
            }
        }
        private void StateRecordElem_Click(object sender, EventArgs e)
        {
            StateDispatcher disp = StateDispatcher.GetDispatcher();
            /// Сдесь должно происходить применение измеений
            foreach (TreeNode node in nodesForDel)
            {
                ((brElement) node.Tag).Delete();
            }
            ((brElement)treeView.Nodes[0].Tag).PostNewData();
            treeView = null;
            disp.QuitFromState(); 
        }
        private void StateRecordElem_Click_NoPost(object sender, EventArgs e)
        {
            //if (new Dialogs().CommitCancel())
            //{
                StateDispatcher disp = StateDispatcher.GetDispatcher();
                treeView = null;
                disp.QuitFromState();
          //  }
        }
    }
}
